package mongo

import (
	"cgs-server/helper"
	"cgs-server/server"
	"cgs-server/server/cgs/app/store"
	"fmt"
	"sync"
)

type datastore struct {
	// database instance
	db *helper.Mongo
}

func (d *datastore) PublicWorksheetExt() store.PublicWorksheetExtStore {
	return newPublicWorksheetExtStore(d)
}

func (d *datastore) PublicWorksheet() store.PublicWorksheetStore {
	return newPublicWorksheetStore(d)
}

func (d *datastore) WorksheetSortCut() store.WorksheetShortCutStore {
	return newWorksheetShortCutStore(d)
}

func (d *datastore) Market() store.MarketStore {
	return newMarketStore(d)
}

func (d *datastore) WorksheetPrint() store.WorksheetPrintStore {
	return newWorksheetPrintStore(d)
}

func (d *datastore) App() store.AppStore {
	return newAppStore(d)
}

func (d *datastore) WorksheetRows() store.WorksheetRowsStore {
	return newWorksheetRowsStore(d)
}

func (d *datastore) WorksheetInfo() store.WorksheetInfoStore {
	return newWorksheetInfoStore(d)
}

func (d *datastore) WorksheetGroup() store.WorksheetGroupStore {
	return newWorksheetGroupStore(d)
}

func (d *datastore) WorksheetView() store.WorksheetViewStore {
	return newWorksheetViewStore(d)
}

var (
	mongoFactory store.Factory
	once         sync.Once
)

// GetMongoFactory create mongo factory.
func GetMongoFactory() (store.Factory, error) {
	var err error
	var db *helper.Mongo

	once.Do(func() {
		db, err = server.Mongo()

		mongoFactory = &datastore{db}
	})

	if mongoFactory == nil || err != nil {
		return nil, fmt.Errorf("failed to get mysql store fatory, mysqlFactory: %+v, error: %w", mongoFactory, err)
	}
	return mongoFactory, nil
}
